package com.woniuxy.sales.model.vo;

import lombok.Data;

import java.util.*;

/**
 * 购物车对象
 */
@Data
public class CartVo {

    //购物项集合(键是书籍ID，值是购物项对象)
    private Map<Integer, CartItemVo> items = new LinkedHashMap<>();
    private Double totalPrice;  //总价格
    private Integer amount;     //总数量
    private Integer userId;        //用户的id

    /**
     * 添加购物项
     */
    public void addItem(CartItemVo cartItem) {
        //判断购物车中是否已经存在该商品
        Integer goodsId = cartItem.getGoodsId();
        if (items.containsKey(goodsId)) {
            //存在，则更新数量
            CartItemVo item = items.get(goodsId);
            item.setQuantity(cartItem.getQuantity() + item.getQuantity());
        } else {
            //不存在，则添加
            items.put(goodsId, cartItem);
        }
        //更新总价格和总数量
        updateAmountAndTotalPrice();
    }

    /**
     * 更新总价格和总数量
     */
    private void updateAmountAndTotalPrice() {
        Collection<CartItemVo> cartItems = items.values();
        //计算总价格
        this.totalPrice = cartItems.stream().mapToDouble(item -> item.getSumPrice()).sum();
        //计算总数量
        this.amount = cartItems.stream().mapToInt(item -> item.getQuantity()).sum();
    }

    /**
     * 删除购物项
     */
    public void removeItem(Integer goodsId) {
        items.remove(goodsId);
        updateAmountAndTotalPrice();
    }

    /**
     * 修改购物项中某件商品的数量
     */
    public void updateItemQuantity(Integer goodsId, Integer quantity) {
        //判断这件商品是否存在
        if (items.containsKey(goodsId)) {
            CartItemVo cartItem = items.get(goodsId);
            //判断修改后的数量是否小于等于0
            if (quantity <= 0) {
                //小于等于0，则删除
                items.remove(goodsId);
            } else {
                //大于0，则更新数量
                cartItem.setQuantity(quantity);
            }
            //更新总价格和总数量
            updateAmountAndTotalPrice();
        }
    }

    /**
     * 获取购物车中的所有商品
     */
    public List<CartItemVo> getItemList() {
        return new ArrayList<>(items.values());
    }

    /**
     * 清空购物车
     */
    public void clearCart() {
        items.clear();
        updateAmountAndTotalPrice();
    }
}